﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using Castle.Windsor;

namespace User.Web.UI.Helper.CastleWindsor
{
    public class WindsorControllerActivator : IControllerActivator
    {
        private readonly IWindsorContainer container;
        private const string CurrentControllerIndexName = "CurrentControllerItem";

        public WindsorControllerActivator(IWindsorContainer container)
        {
            this.container = container;
        }

        public IController Create(RequestContext requestContext, Type controllerType)
        {
            if (controllerType == null)
            {
                throw new HttpException(404, string.Format("The controller for path '{0}' could not be found.", requestContext.HttpContext.Request.Path));
            }

            //Unseren Controller auflösen per Castle Windsor
            var controller = (IController)this.container.Resolve(controllerType);

            //Prüfen ob bereits ein Controller im HttpContext enthalten ist, wenn ja wird dieser entfernt um den aktuellen Hinzufügen zu können.
            if (HttpContext.Current.Items.Contains(CurrentControllerIndexName))
            {
                HttpContext.Current.Items.Remove(CurrentControllerIndexName);
            }

            //Unseren aktuellen Controller dem Context hinzufügen, dann können wir später darauf zugreifen.
            HttpContext.Current.Items.Add(CurrentControllerIndexName, controller);

            return controller;

        }

        /// <summary>
        /// Gibt den aktuellen Controller zurück der aktuell verwendet wird.
        /// </summary>
        public static IController GetCurrentController()
        {
            //Prüfen ob ein Controller im aktuellen Context hinterlegt wurde.
            if (HttpContext.Current.Items.Contains(CurrentControllerIndexName))
            {
                return (IController)HttpContext.Current.Items[CurrentControllerIndexName];
            }

            throw new Exception("No Controller found in the Current HttpContext");
        }
    }
}